package net.lzzy.practices.entities;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 用户实体类，继承自BaseEntity。
 * 该类表示系统中的用户，包含用户的基本信息和与课程、成绩等相关的关联信息。
 *
 * @author 作者名
 * @version 1.0
 * @since 日期
 */
@Entity
@Getter
@Setter
public class User extends BaseEntity {
    @Transient
    public static final int TYPE_BANNED = -1;

    @Transient
    public static final int TYPE_ADMIN = 0;

    @Transient
    public static final int TYPE_TEACHER = 1;

    @Transient
    public static final int TYPE_STUDENT = 2;

    private String nickName;

    private String userName;

    private String email;

    private String phone;

    private String password;

    private String avatar;

    private int type;

    private String salt;

    private boolean applyTeacher;
    @Temporal(TemporalType.TIMESTAMP)
    private Date createTime;
    @Temporal(TemporalType.TIMESTAMP)
    private Date updateTime;

    @OneToMany(mappedBy = "teacher")
//    @JsonManagedReference
    private List<Course> courses = new ArrayList<>();

    @ManyToMany(mappedBy = "students")
//    @JsonIgnore
    private List<Course> enrolledCourses = new ArrayList<>();

    @OneToMany(mappedBy = "student")
    private List<Result> results = new ArrayList<>();

    @OneToMany(mappedBy = "student")
    private List<Applicant> applicants = new ArrayList<>();

    public User(){
        createTime =  new Date();
        updateTime =  new Date();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        User user = (User) o;
        return id.equals(user.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}